﻿//------------------------------------------------------------------------------
// The contents of this file are subject to the Microsoft Public License (Ms-PL)
// You may obtain a copy of the License at http://psadmin.codeplex.com/license. 
// 
// Software distributed under the License is distributed on an "AS IS" basis, 
// WITHOUT WARRANTY OF ANY KIND, either express or implied. 
// See the License for the specific language governing rights and limitations 
// under the License.
// 
// The initial developer is Ben Foster (ben.foster@retroviz.com)
// Copyright (c) Retroviz Limited (http://www.retroviz.com).
// All Rights Reserved.
//------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PSAdmin.Core.Interfaces;
using PSAdmin.Core.Domain;
using PSAdmin.Core;
using NHibernate.Criterion;
using NHibernate;

namespace PSAdmin.Data.Repositories
{
    public class UserEventRepository : IUserEventRepository
    {
        private ISession _session;

        public UserEventRepository(ISession session) {
            _session = session;
        }
        
        public Guid Save(UserEvent entity) {
            using (var txn = _session.BeginTransaction()) {
                _session.Save(entity);
                txn.Commit();
            }
            return entity.Id;
        }

        public void Delete(UserEvent entity)
        {
            throw new NotImplementedException();
        }

        public UserEvent GetById(Guid id)
        {
            throw new NotImplementedException();
        }

        public ICollection<UserEvent> GetAll()
        {
            throw new NotImplementedException();
        }

        public PagedList<UserEvent> GetPaged(int pageIndex, int pageSize) {
            var rowCount = _session.CreateCriteria<UserEvent>()
                                .SetProjection(Projections.RowCount())
                                .FutureValue<Int32>();

            var results = _session.CreateCriteria<UserEvent>()
                .SetFirstResult((pageIndex - 1) * pageSize)
                .SetMaxResults(pageSize)
                .AddOrder(new Order("DateCreated", false))
                .Future<UserEvent>()
                .ToList<UserEvent>();

            return new PagedList<UserEvent>(results, pageSize, pageSize, rowCount.Value);
        }
    }
}
